#include <iostream>
using namespace std;

/*
1.纯虚函数
             虚函数的一种特例

             写法：  virtual  返回值  函数名(参数)=0;   空架子
       特点：
             只有声明没有定义，没有函数体
       作用：
             对外提供接口，实现接口的统一

    2.抽象类(abstract base class 抽象基类)
              概念：只要一个类中定义了纯虚函数，这个类就是抽象类
              特点：
                 第一：抽象类无法创建对象，专门提供接口让别人(子类)去实现的
                 第二：子类继承了抽象类，子类必须把抽象类中所有的纯虚函数都实现，如果有任何一个纯虚函数没有实现，那么子类依然是抽象类
                 注意：子类实现抽象类的纯虚函数，必须同名同参，同返回值

    3.拓展: 常用的设计模式
*/

class A
{
public:
    virtual void func() = 0; // 纯虚函数
    virtual bool compare() = 0;
};

class B : public A
{
public:
    void func()
    {
        cout << "B::func()" << endl;
    }

    bool compare()
    {
        cout << "根据场景B依据人物经验值比较" << endl;
        return true;
    }
};

class C : public A
{
public:
    void func()
    {
        cout << "C::func()" << endl;
    }

    bool compare()
    {
        cout << "根据场景C依据人物攻击值比较" << endl;
        return false;
    }
};

int main()
{
    A *p = new B();
    p->func();
    p->compare();

    delete p;

    p = new C();
    p->func();
    p->compare();

    delete p;
    return 0;
}